package com.ruoyi.energy.service;

import com.ruoyi.energy.domain.EmsTimeSeriesData;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * TDengine时序数据服务接口
 * 
 * @author ruoyi
 * @date 2025-01-28
 */
public interface ITDengineTimeSeriesService {

    /**
     * 创建数据库
     * 
     * @param database 数据库名称
     * @return 结果
     */
    boolean createDatabase(String database);

    /**
     * 创建超级表
     * 
     * @param stableName 超级表名称
     * @return 结果
     */
    boolean createStable(String stableName);

    /**
     * 创建子表
     * 
     * @param tableName 子表名称
     * @param stableName 超级表名称
     * @param deviceCode 设备编码
     * @param energyType 能耗类型
     * @return 结果
     */
    boolean createTable(String tableName, String stableName, String deviceCode, String energyType);

    /**
     * 插入时序数据
     * 
     * @param data 时序数据
     * @return 结果
     */
    boolean insertTimeSeriesData(EmsTimeSeriesData data);

    /**
     * 批量插入时序数据
     * 
     * @param dataList 时序数据列表
     * @return 结果
     */
    boolean batchInsertTimeSeriesData(List<EmsTimeSeriesData> dataList);

    /**
     * 查询设备最新数据
     * 
     * @param deviceCode 设备编码
     * @return 最新时序数据
     */
    EmsTimeSeriesData selectLatestDataByDevice(String deviceCode);

    /**
     * 查询设备历史数据
     * 
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 历史时序数据列表
     */
    List<EmsTimeSeriesData> selectHistoryDataByDevice(String deviceCode, Date startTime, Date endTime);

    /**
     * 查询设备历史数据（分页）
     * 
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制条数
     * @param offset 偏移量
     * @return 历史时序数据列表
     */
    List<EmsTimeSeriesData> selectHistoryDataByDeviceWithPage(String deviceCode, Date startTime, Date endTime, 
                                                               int limit, int offset);

    /**
     * 查询设备聚合数据（按时间间隔）
     * 
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param interval 时间间隔（如：1h、5m、1d）
     * @return 聚合数据列表
     */
    List<Map<String, Object>> selectAggregatedDataByDevice(String deviceCode, Date startTime, Date endTime, String interval);

    /**
     * 查询多设备最新数据
     * 
     * @param deviceCodes 设备编码列表
     * @return 设备最新数据映射
     */
    Map<String, EmsTimeSeriesData> selectLatestDataByDevices(List<String> deviceCodes);

    /**
     * 查询能耗统计数据
     * 
     * @param deviceCodes 设备编码列表
     * @param energyType 能耗类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 能耗统计数据
     */
    Map<String, Object> selectEnergyStatistics(List<String> deviceCodes, String energyType, Date startTime, Date endTime);

    /**
     * 查询设备状态统计
     * 
     * @param deviceCodes 设备编码列表
     * @return 设备状态统计
     */
    Map<String, Integer> selectDeviceStatusStatistics(List<String> deviceCodes);

    /**
     * 删除指定时间范围的数据
     * 
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 结果
     */
    boolean deleteDataByTimeRange(String deviceCode, Date startTime, Date endTime);

    /**
     * 检查数据库连接
     *
     * @return 连接状态
     */
    boolean checkConnection();

    // ==================== 新增业务查询方法 ====================

    /**
     * 查询所有设备的最新数据
     *
     * @return 设备最新数据列表
     */
    List<EmsTimeSeriesData> selectAllDevicesLatestData();

    /**
     * 查询设备数据总数
     *
     * @param deviceCode 设备编码（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 数据总数
     */
    long countDeviceData(String deviceCode, Date startTime, Date endTime);

    /**
     * 查询设备在线状态统计
     *
     * @return 在线状态统计 {online: 数量, offline: 数量}
     */
    Map<String, Long> selectDeviceOnlineStatistics();

    /**
     * 查询设备能耗排行榜
     *
     * @param energyType 能源类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 限制数量
     * @return 能耗排行榜
     */
    List<Map<String, Object>> selectDeviceEnergyRanking(String energyType, Date startTime, Date endTime, int limit);

    /**
     * 查询设备告警数据
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 告警数据列表
     */
    List<Map<String, Object>> selectDeviceAlarmData(String deviceCode, Date startTime, Date endTime);

    /**
     * 查询设备效率分析数据
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 效率分析数据
     */
    Map<String, Object> selectDeviceEfficiencyAnalysis(String deviceCode, Date startTime, Date endTime);

    /**
     * 查询设备负载分析数据
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param interval 时间间隔
     * @return 负载分析数据
     */
    List<Map<String, Object>> selectDeviceLoadAnalysis(String deviceCode, Date startTime, Date endTime, String interval);

    /**
     * 查询多设备对比数据
     *
     * @param deviceCodes 设备编码列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param interval 时间间隔
     * @return 对比数据
     */
    List<Map<String, Object>> selectMultiDeviceComparisonData(List<String> deviceCodes, Date startTime, Date endTime, String interval);

    /**
     * 查询设备数据导出
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param fields 导出字段列表
     * @return 导出数据
     */
    List<Map<String, Object>> selectDeviceDataForExport(String deviceCode, Date startTime, Date endTime, List<String> fields);

    /**
     * 查询设备数据质量统计
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 数据质量统计
     */
    Map<String, Object> selectDeviceDataQualityStatistics(String deviceCode, Date startTime, Date endTime);

    /**
     * 查询设备峰谷电分析
     *
     * @param deviceCode 设备编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 峰谷电分析数据
     */
    Map<String, Object> selectDevicePeakValleyAnalysis(String deviceCode, Date startTime, Date endTime);
}